import fs from "fs";

const todoFilePath = "./todo.json";

interface Todo {
  id: string;
  text: string;
  completed: boolean;
  ctime: number;
  mtime: number;
}
class TodoDatabase {
  private todos: Todo[];

  constructor() {
    this.todos = readTodoData();
  }

  public add(todo: Todo): void {
    this.todos.push(todo);
    reset();
    writeTodoData(this.todos);
  }

  public get(id: string): Todo | undefined {
    return this.todos.find((todo) => todo.id === id);
  }

  public getAll(): Todo[] {
    console.log(this.todos);
    return this.todos;
  }

  public update(todo: Todo): void {
    const index = this.todos.findIndex((item) => item.id === todo.id);
    if (index !== -1) {
      this.todos[index] = todo;
      reset();
      writeTodoData(this.todos);
    }
  }

  public delete(id: string): void {
    const index = this.todos.findIndex((item) => item.id === id);
    if (index !== -1) {
      this.todos.splice(index, 1);
      reset();
      writeTodoData(this.todos);
    }
  }
}

function readTodoData(): Todo[] {
  try {
    const data = fs.readFileSync(todoFilePath);
    return JSON.parse(data.toString("utf8")) as Todo[];
  } catch (err) {
    console.error("Failed to read todo data", err);
    return [];
  }
}

function writeTodoData(data: Todo[]) {
  try {
    fs.writeFileSync(todoFilePath, JSON.stringify(data));
  } catch (err) {
    console.error("Failed to write todo data", err);
  }
}

function reset(): void {
  fs.writeFileSync(todoFilePath, JSON.stringify({}));
}

const db = new TodoDatabase();
export default db;
